package com.example.libpro.Service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.Nullable;

import com.example.libpro.DAO.ReaderDAO;
import com.example.libpro.DBEntity.UserEntity;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 图书管理系统登录业务服务类
 * 作用：1. 处理登录核心业务逻辑，封装《安卓设计报告.docx》中"登录功能"的完整流程（输入校验→账号密码匹配→角色识别）；
 * 2. 调用ReaderDAO实现数据访问，隔离业务逻辑与数据操作；
 * 3. 为应用层（LoginManager）提供登录结果（成功/失败原因）与用户角色信息。
 * 核心业务：账号密码校验、用户角色识别（管理员/读者）、登录状态封装
 * 依赖：ReaderDAO（查询用户表验证账号密码）
 */
public class LoginService extends Service {
    private static final String TAG = "LoginService";
    private ReaderDAO readerDAO; // 读者数据访问对象
    private final IBinder binder = new LocalBinder();

    public LoginService(){
        LoginService.this.readerDAO = null;
    }
    // 构造方法：初始化依赖的DAO
    /**
     * LoginService构造方法
     * @param context Android上下文对象，用于初始化ReaderDAO
     * 功能：建立与数据管理层的连接，为登录业务提供数据访问能力
     */
    public LoginService(Context context) {
        super.onCreate();
        this.readerDAO = new ReaderDAO(context);
    }
    public class LocalBinder extends Binder {
        public LoginService getService() {
            LoginService.this.readerDAO = new ReaderDAO(getApplicationContext());
            return LoginService.this;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
    // 登录验证（核心业务方法）
    /**
     * 执行登录验证逻辑（完整流程：输入校验→账号密码匹配→角色识别）
     * @param account 登录账号（用户输入）
     * @param password 登录密码（用户输入，建议传入明文，在服务层加密后与数据库比对）
     * @return LoginResult 登录结果封装类（含成功标识、错误信息、用户角色）
     * 业务流程：
     * 1. 输入校验：判断账号/密码是否为空（空则返回"账号或密码不能为空"）；
     * 2. 密码加密：将输入密码加密（与数据库存储的加密密码一致，如MD5）；
     * 3. 账号密码匹配：调用ReaderDAO.queryUserByAccountAndPwd()查询用户表；
     * 4. 结果处理：
     *    - 无匹配用户：返回"账号或密码错误"；
     *    - 有匹配用户：返回成功，同时返回角色信息（1=管理员，2=读者）。
     * 适配报告：完全贴合《安卓设计报告.docx》"登录功能-后台查询SQLite用户表→匹配则登录成功"流程
     */
    public LoginResult login(String account, String password) {
        // 1. 输入校验
        if (TextUtils.isEmpty(account) || TextUtils.isEmpty(password)) {
            return new LoginResult(false, "账号或密码不能为空", -1, null);
        }


        // 3. 调用DAO查询用户
        UserEntity user = readerDAO.queryUserByAccountAndPwd(account, password);

        // 4. 处理查询结果
        if (user == null) {
            Log.i(TAG, "登录失败：无匹配用户");
            return new LoginResult(false, "账号或密码错误", -1, null);
        } else {
            Log.i(TAG, "登录成功：匹配用户");
            // 登录成功：返回角色ID（1=管理员，2=读者）和用户信息
            return new LoginResult(true, "登录成功", user.getRoleId(), user);
        }
    }



    // 登录结果封装类（内部静态类，用于返回多参数结果）
    /**
     * 登录结果封装类（服务层→应用层的数据传输载体）
     */
    public static class LoginResult {
        private boolean success;       // 登录是否成功
        private String errorMsg;       // 错误信息（失败时非空）
        private Integer roleId;        // 角色ID（成功时：1=管理员，2=读者）
        private UserEntity userEntity; // 用户实体（成功时非空，含用户ID、姓名等）

        public LoginResult(boolean success, String errorMsg, Integer roleId, UserEntity userEntity) {
            this.success = success;
            this.errorMsg = errorMsg;
            this.roleId = roleId;
            this.userEntity = userEntity;
        }

        // Getter方法（供应用层获取结果）
        public boolean isSuccess() { return success; }
        public String getErrorMsg() { return errorMsg; }
        public Integer getRoleId() { return roleId; }
        public UserEntity getUserEntity() { return userEntity; }
    }
}